package veterinaria.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import veterinaria.excepcion.LoginExcepcion;
import veterinaria.excepcion.DAOExcepcion;
import veterinaria.modelo.Paciente;
import veterinaria.negocio.GestionDueno;
import veterinaria.util.ConexionBD;

public class PacienteDAO extends BaseDAO {

	public Paciente insertar(Paciente doc) throws DAOExcepcion {
		String query;
		query = "INSERT INTO Paciente (nombre, especie, raza, genero, esterilizado, tamanio, actividad, peso, fenacimiento, idCliente) values (?,?,?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, doc.getNombre());
			stmt.setString(2, doc.getEspecie());
			stmt.setString(3, doc.getRaza());
			stmt.setString(4, doc.getGenero());
			stmt.setInt(5, doc.getEsterilizado());
			stmt.setString(6, doc.getTamanio());
			stmt.setString(7, doc.getActividad());
			stmt.setDouble(8, doc.getPeso());
			stmt.setDate(9, new java.sql.Date(doc.getFeNacimiento().getTime()));
			
			
			
			
			stmt.setInt(10, doc.getDueno().getIdDueno());

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return doc;

	}
	
	
	public Collection<Paciente> listar() throws DAOExcepcion {
		Collection<Paciente> c = new ArrayList<Paciente>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select idPaciente,nombre, especie, raza, genero, esterilizado, tamanio, actividad, peso, fenacimiento, idCliente from Paciente order by concat(nombre ,' ',paterno ,' ', materno)";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Paciente vo = new Paciente();
				
				vo.setIdPaciente(rs.getInt("idPaciente"));
				vo.setNombre(rs.getString("nombre"));
				vo.setEspecie(rs.getString("especie"));
				vo.setRaza(rs.getString("raza"));
				vo.setGenero(rs.getString("genero"));
				vo.setEsterilizado(rs.getInt("esterilizado"));
				vo.setTamanio(rs.getString("tamanio"));
				vo.setActividad(rs.getString("actividad"));
				GestionDueno d= new GestionDueno();
				vo.setDueno(d.obtenerPorCodigo(rs.getInt("idCliente")));	

				
				c.add(vo);
				
				
				
			
				
				
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
/*
	public Paciente actualizar(Paciente doc) throws DAOExcepcion {
		String query = "UPDATE Paciente SET  nombre=?,  paterno=?, materno=?, telefono=?,  correo=?, administrador=?,  direccion=?,clave=? WHERE idPaciente=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, doc.getNombre());
			stmt.setString(2, doc.getPaterno());
			stmt.setString(3, doc.getMaterno());
			stmt.setString(4, doc.getTelefono());
			stmt.setString(5, doc.getCorreo());
			stmt.setInt(6, doc.getAdministrador());
			stmt.setString(7, doc.getDireccion());
			stmt.setString(8, doc.getClave());
			stmt.setInt(9, doc.getCodigo());

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return doc;

	}


	
	
	public Collection<Paciente> listar() throws DAOExcepcion {
		Collection<Paciente> c = new ArrayList<Paciente>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select idPaciente,nombre,  paterno, materno, telefono,  correo, administrador,  direccion,clave from Paciente order by concat(nombre ,' ',paterno ,' ', materno)";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Paciente vo = new Paciente();
				vo.setCodigo(rs.getInt("idPaciente"));
				vo.setNombre(rs.getString("nombre"));
				vo.setPaterno(rs.getString("paterno"));
				vo.setMaterno(rs.getString("materno"));
				vo.setTelefono(rs.getString("telefono"));
				vo.setCorreo(rs.getString("correo"));
				vo.setAdministrador(rs.getInt("administrador"));
				vo.setClave(rs.getString("clave"));
				vo.setDireccion(rs.getString("direccion"));

				
				c.add(vo);
				
				
				
			
				
				
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	public void eliminar(int idPaciente) throws DAOExcepcion {
		String query = "delete from Paciente WHERE idPaciente=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idPaciente);
			int i = stmt.executeUpdate();

			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	
	public Paciente obtener(String atributo,Object param) throws DAOExcepcion {
		Paciente vo = new Paciente();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query ="SELECT idPaciente, nombre, paterno, materno, correo, telefono, administrador, direccion, clave FROM Paciente Cliente where ";
			
			
			
			if ("CODIGO".equals(atributo))
				query = query + "idPaciente=?";
			if ("NOMBRE".equals(atributo))
				query = query + "concat(nombre ,' ',paterno ,' ', materno)=?";
			
			
			
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);

			
			
			if ("CODIGO".equals(atributo))
				stmt.setInt(1, (int)param);
			if ("NOMBRE".equals(atributo) || "DOCUMENTO".equals(atributo))
				stmt.setString(1, (String) param);
				
			rs = stmt.executeQuery();
			
			if (rs.next()) {
				vo.setCodigo(rs.getInt("idPaciente"));
				vo.setNombre(rs.getString("nombre"));
				vo.setPaterno(rs.getString("paterno"));
				vo.setMaterno(rs.getString("materno"));
				vo.setTelefono(rs.getString("telefono"));
				vo.setCorreo(rs.getString("correo"));
				vo.setAdministrador(rs.getInt("administrador"));
				vo.setClave(rs.getString("clave"));
				vo.setDireccion(rs.getString("direccion"));

			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}*/

	public Paciente obtener(String atributo,Object param) throws DAOExcepcion {
		Paciente vo = new Paciente();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		DuenoDAO duenoDao = new DuenoDAO();
		
		try {
			String query ="select idPaciente, nombre, especie, raza, genero, esterilizado, tamanio, actividad, peso, fenacimiento, idCliente from paciente where ";		
			
			if ("CODIGO".equals(atributo))
				query = query + "idPaciente=?";
			if ("NOMBRE".equals(atributo))
				query = query + "nombre=?";
			
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);

			if ("CODIGO".equals(atributo))
				stmt.setInt(1, (int)param);
			if ("NOMBRE".equals(atributo))
				stmt.setString(1, (String)param);
			
			rs = stmt.executeQuery();
			if (rs.next()) {

				vo.setIdPaciente(rs.getInt(1));
				vo.setNombre(rs.getString(2));
				vo.setEspecie(rs.getString(3));
				vo.setRaza(rs.getString(4));
				vo.setGenero(rs.getString(5));
				vo.setEsterilizado(rs.getInt(6));
				vo.setTamanio(rs.getString(7));
				vo.setActividad(rs.getString(8));
				vo.setPeso(rs.getDouble(9));
				vo.setFeNacimiento(rs.getDate(10));
				vo.setDueno(duenoDao.obtener("CODIGO", rs.getInt(11)));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
}
